package peter.study.spring.parsesource.jdbc.impl;

import java.util.List;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;

import peter.study.spring.parsesource.jdbc.UserRowMapper;
import peter.study.spring.parsesource.jdbc.UserService;
import peter.study.spring.parsesource.jdbc.bean.User;

/**
 * 此类作为User JDBC操作的总入口类。
 *  save
 *  get
 * @author peter
 *
 */
public class UserServiceImpl implements UserService {
    private JdbcTemplate template;
 
    // Note: 之类会传入DataSource的扩展类型org.apache.commons.dbcp.BasicDataSource，此类型为commons-dbcp.jar中的类型，所以说你需要它。
    // Quest: 配置文件jdbc.xml中的destroy-method="close"是什么意思？说明BasicDataSource中有close方法。
    public void setDataSource(DataSource dataSource) {
        template = new JdbcTemplate(dataSource);
    }

    @Override
    public int save(User user) {
        // Note: 此方法抛出了特殊的异常类，DataAccessException，此类是在tx.jar的dao包下。
        // Quest: 对于JdbcTemplate.update方法的封装策略，原文意犹未尽。P218
        template.update("insert into user(id, name, age, sex) values(?, ?, ?, ?)",
            new Object[] { user.getId(), user.getName(), user.getAge(), user.getSex() },
            new int[] {java.sql.Types.INTEGER, java.sql.Types.VARCHAR, java.sql.Types.INTEGER, java.sql.Types.VARCHAR });
        return 1;
    }

    @Override
    public List<User> getUsers() {
        return template.query("select * from user", new UserRowMapper());
    }

}
